In this notebook we conduct exploratory factor analyses (EFAs) on the datasets for our studies of concepts of mental life, in which each participants judged the various mental capacities of a particular target entity. We analyze datasets for adults and children from each of our five field sites: the US, Ghana, Thailand, China, and Vanuatu.
This notebook contains secondary analyses, parallel to the results presented in the main text, in which we recoded responses of “kinda” to be equivalent to “yes” (i.e., coded as 1) and use tetrachoric rather than Pearson correlations.
Adults
Samples
country n
US 127
Ghana 150
Thailand 150
China 136
Vanuatu 148
Total 711
Factor retention: parallel analysis

Exploratory factor analysis
Factor loadings

Congruence

Children
Samples
country n
US 117
Ghana 150
Thailand 152
China 131
Vanuatu 143
Total 693
Factor retention: parallel analysis

Exploratory factor analysis
Factor loadings

Bootstrapped congruence

All samples
Congruence

Jaccard Similarity

Developmental comparisons







Interfactor correlations
US ADULTS
F1 F2 F3
F1 1.0000000 0.4947534 0.4804340
F2 0.4947534 1.0000000 0.5291443
F3 0.4804340 0.5291443 1.0000000
US CHILDREN
F1 F2 F3
F1 1.0000000 0.5415083 0.3161305
F2 0.5415083 1.0000000 0.4435483
F3 0.3161305 0.4435483 1.0000000
GHANA ADULTS
F1 F2 F3
F1 1.0000000 0.2798815 0.3582925
F2 0.2798815 1.0000000 0.2425925
F3 0.3582925 0.2425925 1.0000000
GHANA CHILDREN
F1 F2 F3
F1 1.0000000 0.5710736 0.1796716
F2 0.5710736 1.0000000 0.3896234
F3 0.1796716 0.3896234 1.0000000
THAILAND ADULTS
F1 F2 F3
F1 1.0000000 0.4506808 0.3488039
F2 0.4506808 1.0000000 0.4871667
F3 0.3488039 0.4871667 1.0000000
THAILAND CHILDREN
F1 F2 F3 F4
F1 1.00000000 0.5216686 0.3079502 -0.01011904
F2 0.52166859 1.0000000 0.4330757 0.10812086
F3 0.30795020 0.4330757 1.0000000 0.26630370
F4 -0.01011904 0.1081209 0.2663037 1.00000000
CHINA ADULTS
F1 F2
F1 1.0000000 0.5539927
F2 0.5539927 1.0000000
CHINA CHILDREN
F1 F2 F3 F4
F1 1.0000000 0.3387503 0.4822502 0.3791206
F2 0.3387503 1.0000000 0.1854269 0.2362745
F3 0.4822502 0.1854269 1.0000000 0.1783880
F4 0.3791206 0.2362745 0.1783880 1.0000000
VANUATU ADULTS
F1 F2
F1 1.0000000 0.6904623
F2 0.6904623 1.0000000
VANUATU CHILDREN
F1 F2 F3
F1 1.0000000 0.3665866 0.5096434
F2 0.3665866 1.0000000 0.3013293
F3 0.5096434 0.3013293 1.0000000
LS0tCnRpdGxlOiAiQ29uY2VwdHMgb2YgbWVudGFsIGxpZmUgYWNyb3NzIGN1bHR1cmVzOiBTZWNvbmRhcnkgYW5hbHlzaXMiCnN1YnRpdGxlOiAiRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIHVzaW5nIGZ1bGwgZGF0YXNldHMsIHRldHJhY2hvcmljIGNvcnJlbGF0aW9ucywgYW5kIG9ibGlxdWUgdHJhbnNmb3JtYXRpb25zIgphdXRob3JzOiAiKipLYXJhIFdlaXNtYW4qKiwgQ3Jpc3RpbmUgSC4gTGVnYXJlLCBSYWNoZWwgRS4gU21pdGgsIFZpdmlhbiBBLiBEem9rb3RvLCBGZWxpY2l0eSBBdWxpbm8sIEVtaWx5IE5nLCBKb2huIEMuIER1bGluLCBOaWNvbGUgUm9zcy1aZWhuZGVyLCBKb3NodWEgRC4gQnJhaGluc2t5LCAmIFRhbnlhIE0uIEx1aHJtYW5uIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZSA9IEYsIHdhcm5pbmcgPSBGQUxTRSkKYGBgCgpJbiB0aGlzIG5vdGVib29rIHdlIGNvbmR1Y3QgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2VzIChFRkFzKSBvbiB0aGUgZGF0YXNldHMgZm9yIG91ciBzdHVkaWVzIG9mIGNvbmNlcHRzIG9mIG1lbnRhbCBsaWZlLCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50cyBqdWRnZWQgdGhlIHZhcmlvdXMgbWVudGFsIGNhcGFjaXRpZXMgb2YgYSBwYXJ0aWN1bGFyIHRhcmdldCBlbnRpdHkuIFdlIGFuYWx5emUgZGF0YXNldHMgZm9yIGFkdWx0cyBhbmQgY2hpbGRyZW4gZnJvbSBlYWNoIG9mIG91ciBmaXZlIGZpZWxkIHNpdGVzOiB0aGUgVVMsIEdoYW5hLCBUaGFpbGFuZCwgQ2hpbmEsIGFuZCBWYW51YXR1LiAKClRoaXMgbm90ZWJvb2sgY29udGFpbnMgc2Vjb25kYXJ5IGFuYWx5c2VzLCBwYXJhbGxlbCB0byB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgaW4gdGhlIG1haW4gdGV4dCwgaW4gd2hpY2ggd2UgcmVjb2RlZCByZXNwb25zZXMgb2YgImtpbmRhIiB0byBiZSBlcXVpdmFsZW50IHRvICJ5ZXMiIChpLmUuLCBjb2RlZCBhcyAxKSBhbmQgdXNlIHRldHJhY2hvcmljIHJhdGhlciB0aGFuIFBlYXJzb24gY29ycmVsYXRpb25zLgoKCmBgYHtyLCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9CnNvdXJjZSgiLi9zY3JpcHRzL2RlcGVuZGVuY2llcy5SIikKc291cmNlKCIuL3NjcmlwdHMvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Zhcl9yZWNvZGVfY29udHJhc3QuUiIpCmBgYAoKYGBge3IgZGF0YX0KIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBhZHVsdHMKZF91c19hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF91c19hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfZ2hfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3RoX2FkdWx0cyA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3RoX2FkdWx0cy5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9jaF9hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdnRfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQoKIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBjaGlsZHJlbgpkX3VzX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdXNfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9naF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF90aF9jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3RoX2NoaWxkcmVuLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX2NoX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfY2hfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdnRfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF92dF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkgJT4lCiAgIyBmaWx0ZXIgb3V0IHBhcnRpY2lwYW50cyBvdXRzaWRlIG9mIHRoZSBhZ2UgcmFuZ2UKICBmaWx0ZXIoKGFnZSA+PSA2ICYgYWdlIDw9IDEyKSB8IGlzLm5hKGFnZSkpCmBgYAoKYGBge3IgcmVjb2RlfQojIHJlY29kZSBraW5kYSA9IHllczogYWR1bHRzCmRfdXNfYWR1bHRzIDwtIGRfdXNfYWR1bHRzICU+JSAKICBtdXRhdGUocmVzcG9uc2UgPSBhcy5udW1lcmljKGdzdWIoMC41LCAxLCByZXNwb25zZSkpKQpkX2doX2FkdWx0cyA8LSBkX2doX2FkdWx0cyAlPiUgCiAgbXV0YXRlKHJlc3BvbnNlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgcmVzcG9uc2UpKSkKZF90aF9hZHVsdHMgPC0gZF90aF9hZHVsdHMgJT4lIAogIG11dGF0ZShyZXNwb25zZSA9IGFzLm51bWVyaWMoZ3N1YigwLjUsIDEsIHJlc3BvbnNlKSkpCmRfY2hfYWR1bHRzIDwtIGRfY2hfYWR1bHRzICU+JSAKICBtdXRhdGUocmVzcG9uc2UgPSBhcy5udW1lcmljKGdzdWIoMC41LCAxLCByZXNwb25zZSkpKQpkX3Z0X2FkdWx0cyA8LSBkX3Z0X2FkdWx0cyAlPiUgCiAgbXV0YXRlKHJlc3BvbnNlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgcmVzcG9uc2UpKSkKCiMgcmVjb2RlIGtpbmRhID0geWVzLCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBjaGlsZHJlbgpkX3VzX2NoaWxkcmVuIDwtIGRfdXNfY2hpbGRyZW4gJT4lIAogIG11dGF0ZShyZXNwb25zZSA9IGFzLm51bWVyaWMoZ3N1YigwLjUsIDEsIHJlc3BvbnNlKSkpCmRfZ2hfY2hpbGRyZW4gPC0gZF9naF9jaGlsZHJlbiAlPiUgCiAgbXV0YXRlKHJlc3BvbnNlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgcmVzcG9uc2UpKSkKIyBkX2doX2VuZ19jaGlsZHJlbiA8LSBkX2doX2VuZ19jaGlsZHJlbiAlPiUKIyBtdXRhdGUocmVzcG9uc2UgPSBhcy5udW1lcmljKGdzdWIoMC41LCAxLCByZXNwb25zZSkpKQpkX3RoX2NoaWxkcmVuIDwtIGRfdGhfY2hpbGRyZW4gJT4lIAogIG11dGF0ZShyZXNwb25zZSA9IGFzLm51bWVyaWMoZ3N1YigwLjUsIDEsIHJlc3BvbnNlKSkpCmRfY2hfY2hpbGRyZW4gPC0gZF9jaF9jaGlsZHJlbiAlPiUgCiAgbXV0YXRlKHJlc3BvbnNlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgcmVzcG9uc2UpKSkKZF92dF9jaGlsZHJlbiA8LSBkX3Z0X2NoaWxkcmVuICU+JSAKICBtdXRhdGUocmVzcG9uc2UgPSBhcy5udW1lcmljKGdzdWIoMC41LCAxLCByZXNwb25zZSkpKQpgYGAKCmBgYHtyIHdpZGV9CiMgbWFrZSB3aWRlLWZvcm0gZGF0YXNldHMgZm9yIEVGQTogYWR1bHRzCmRfdXNfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF91c19hZHVsdHMpCmRfZ2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9hZHVsdHMpCmRfdGhfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9hZHVsdHMpCmRfY2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9jaF9hZHVsdHMpCmRfdnRfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF92dF9hZHVsdHMpCgojIG1ha2Ugd2lkZS1mb3JtIGRhdGFzZXRzIGZvciBFRkE6IGNoaWxkcmVuCmRfdXNfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3VzX2NoaWxkcmVuKQpkX2doX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9jaGlsZHJlbikKIyBkX2doX2VuZ19jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfZ2hfZW5nX2NoaWxkcmVuKQpkX3RoX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9jaGlsZHJlbikKZF9jaF9jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfY2hfY2hpbGRyZW4pCmRfdnRfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3Z0X2NoaWxkcmVuKQpgYGAKCgojIEFkdWx0cwoKIyMgU2FtcGxlcwoKYGBge3Igc2FtcGxlcyBhZHVsdHN9CmJpbmRfcm93cyhkX3VzX2FkdWx0cywgZF9naF9hZHVsdHMsIGRfdGhfYWR1bHRzLCBkX2NoX2FkdWx0cywgZF92dF9hZHVsdHMpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCkgJT4lCiAgY291bnQoY291bnRyeSkgJT4lCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBGYWN0b3IgcmV0ZW50aW9uOiBwYXJhbGxlbCBhbmFseXNpcwoKYGBge3IgcGFyYWxsZWwgZGlzdCBhZHVsdHMsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAwLjV9CiMgTk9URTogSGVyZSBpcyBkaXN0cmlidXRpb24gb3ZlciBvdXRjb21lcyBvZiBwYXJhbGxlbCBhbmFseXNpcyB3aXRoIDEwMCBpdGVyYXRpb25zLiBXZSdsbCBjaG9vc2UgdGhlIG1lZGlhbiBudW1iZXIgb2YgZmFjdG9ycy4KCmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2FkdWx0c190ZXQuUkRTIikpIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2FkdWx0cyA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfYWR1bHRzX3RldC5SRFMiKQogIAp9IGVsc2UgewogIAogIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzIDwtIGRhdGEuZnJhbWUodXMgPSBOVUxMLCBnaCA9IE5VTEwsIHRoID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gTlVMTCwgdnQgPSBOVUxMKQogIAogIHNldC5zZWVkKDU0MzIxKQogIG5fY29yZXMgPC0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCkKICBvcHRpb25zKG1jLmNvcmVzID0gbl9jb3JlcykKICAKICBmb3IgKGkgaW4gMToxMDApIHsKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJ1cyJdIDwtIGZhLnBhcmFsbGVsKGRfdXNfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgImdoIl0gPC0gZmEucGFyYWxsZWwoZF9naF9hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0ICAgICAKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJ0aCJdIDwtIGZhLnBhcmFsbGVsKGRfdGhfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgImNoIl0gPC0gZmEucGFyYWxsZWwoZF9jaF9hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAidnQiXSA8LSBmYS5wYXJhbGxlbChkX3Z0X2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QKICB9CiAgCiAgc2F2ZVJEUyhwYV9vdXRjb21lc19kaXN0X2FkdWx0cywgZmlsZSA9ICIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfYWR1bHRzX3RldC5SRFMiKQp9CgojIHBsb3QKcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJpdGVyIikgJT4lCiAgZ2F0aGVyKGNvdW50cnksIG5mYWN0LCAtaXRlcikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaCIsICJ0aCIsICJjaCIsICJ2dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbmZhY3QpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnkpICsKICBnZW9tX2JhcihzdGF0ID0gImNvdW50IikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEsIG1heChwYV9vdXRjb21lc19kaXN0X2FkdWx0cykgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEwMCwgMSkpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGZhY3RvcnMgc3VnZ2VzdGVkIGJ5IGZhLnBhcmFsbGVsKCkiKQpgYGAKCiMjIEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcwoKYGBge3IgZWZhIGFkdWx0c30Kc2V0LnNlZWQoNTQzMjEpCgojIGRvIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpczogYWR1bHRzCmVmYV91c19hZHVsdHMgPC0gZmFfZnVuKGRfdXNfYWR1bHRzX3csCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdXMpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ1c0FEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX2doX2FkdWx0cyA8LSBmYV9mdW4oZF9naF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkZ2gpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2doX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJnaEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9naF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX3RoX2FkdWx0cyA8LSBmYV9mdW4oZF90aF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdGgpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3RoX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ0aEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX2NoX2FkdWx0cyA8LSBmYV9mdW4oZF9jaF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkY2gpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2NoX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJjaEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX3Z0X2FkdWx0cyA8LSBmYV9mdW4oZF92dF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdnQpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ2dEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV92dF9hZHVsdHMkbG9hZGluZ3MpKQpgYGAKCmBgYHtyIGZhY3RvciBuYW1lcyBhZHVsdHN9CmZhY3Rvcl9uYW1lc19hZHVsdHMgPC0gZGF0YS5mcmFtZShmYWN0b3IgPSBjKGNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2FkdWx0cyRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSkpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiYWR1bHRzIikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBjYXNlX3doZW4oZ3JlcGwoIl51cyIsIGZhY3RvcikgfiAiVVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeZ2giLCBmYWN0b3IpIH4gIkdoYW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnRoIiwgZmFjdG9yKSB+ICJUaGFpbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl5jaCIsIGZhY3RvcikgfiAiQ2hpbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJednQiLCBmYWN0b3IpIH4gIlZhbnVhdHUiKSwKICAgICAgICAgY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHNfY291bnRyeSkpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IGdzdWIoIl51cyIsICJVUyAiLCBmYWN0b3IpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5naCIsICJHaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl50aCIsICJUaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5jaCIsICJDaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl52dCIsICJWYS4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIkFEVUxUUyIsICJhZHVsdHMiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiX0YiLCAiIEZhY3RvciAiLCBmYWN0b3JfbmFtZSkpICU+JQogIG11dGF0ZShmYWN0b3JfZGVzY3JpcHQgPSByZWNvZGUoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjEgPSAiQm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0FEVUxUU19GMiA9ICJIZWFydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0FEVUxUU19GMyA9ICJNaW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQURVTFRTX0YxID0gIklubmVyIHNwaGVyZSAobWluZC1saWtlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaEFEVUxUU19GMiA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hBRFVMVFNfRjMgPSAiSW50ZXJwZXJzb25hbCwgcmVsaWdpb3VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQURVTFRTX0YxID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMiA9ICJIZWFydC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQURVTFRTX0YzID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEFEVUxUU19GMSA9ICJIZWFydC1NaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hBRFVMVFNfRjIgPSAiQm9keS1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0QURVTFRTX0YxID0gIkhhcm1vbnkgKG1pbmQtbGlrZSwgaGVhcnQtbGlrZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRBRFVMVFNfRjIgPSAiU2luIChib2R5LWxpa2UpIiksCiAgICAgICAgIGZhY3Rvcl9sYWJkZXNjcmlwdCA9IHBhc3RlKGdzdWIoIi4qX0YiLCAiRiIsIGZhY3RvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9kZXNjcmlwdCwgc2VwID0gIjogIikpCmBgYAoKIyMgRmFjdG9yIGxvYWRpbmdzCgpgYGB7ciBvcmRlciBhZHVsdHN9CiMgb3JkZXIgY2FwYWNpdGllczogYWR1bHRzCm9yZGVyX3VzX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV91c19hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfZ2hfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX2doX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl90aF9hZHVsdHMgPC0gZmEuc29ydChlZmFfdGhfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2NoX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV9jaF9hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfdnRfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX3Z0X2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpgYGAKCmBgYHtyIGxvYWRpbmdzIGFkdWx0c30KIyBjb21waWxlIGxvYWRpbmdzOiBhZHVsdHMKbG9hZGluZ3NfYWR1bHRzIDwtIGJpbmRfcm93cygKICBsb2FkaW5nc19mdW4oZWZhX3VzX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlVTIiksCiAgbG9hZGluZ3NfZnVuKGVmYV9naF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdGhfYWR1bHRzKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVGhhaWxhbmQiKSwKICBsb2FkaW5nc19mdW4oZWZhX2NoX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkNoaW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV92dF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3VzID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl91c19hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfZ2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2doX2FkdWx0cyksCiAgICAgICAgIGNhcGFjaXR5X29yZF90aCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdGhfYWR1bHRzKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2NoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9jaF9hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfdnQgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3Z0X2FkdWx0cykpICU+JQogIGFycmFuZ2UoY291bnRyeSwgZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSksIGNhcGFjaXR5KSAlPiUKICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzKQpgYGAKCmBgYHtyIGhlYXRtYXAgYWR1bHRzLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC43fQojIG1ha2UgaGVhdG1hcCBmaWd1cmU6IGFkdWx0cwpsb2FkaW5nc19hZHVsdHMgJT4lCiAgbXV0YXRlKGZhY3Rvcl9udW0gPSBhcy5udW1lcmljKGdzdWIoIi4qRiIsICIiLCBmYWN0b3IpKSkgJT4lCiAgbXV0YXRlKHNhbXBsZSA9IHBhc3RlKGNvdW50cnksICJhZHVsdHMiLCBzZXAgPSAiXG4iKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihmYWN0b3JfbGFiZGVzY3JpcHQsIGZhY3Rvcl9udW0pLCAKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF91cykpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfZWMpKSwgCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9naCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfdGgpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2NoKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF92dCkpLAogICAgICAgICAgICAgZmlsbCA9IGxvYWRpbmcpKSArCiAgZmFjZXRfZ3JpZCh+IHJlb3JkZXIoc2FtcGxlLCBhcy5udW1lcmljKGNvdW50cnkpKSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSksIHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDIwLCBiYXJ3aWR0aCA9IDAuNSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBwYW5lbC5zcGFjaW5nLnggPSB1bml0KDAuOCwgImxpbmVzIiksCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIkNhcGFjaXR5IiwgZmlsbCA9ICJGYWN0b3JcbmxvYWRpbmciKQpgYGAKCiMjIENvbmdydWVuY2UKCmBgYHtyIGNvbmdydWVuY2UgYWR1bHRzfQpjb25nX2FkdWx0cyA8LSBmYS5jb25ncnVlbmNlKHggPSBsaXN0KGVmYV91c19hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2doX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdGhfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gNSkgJT4lCiAgIyBnZXRfdXBwZXJfdHJpX2Z1bigpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImZhY3Rvcl9BIikgJT4lCiAgZ2F0aGVyKGZhY3Rvcl9CLCBjb25nLCAtZmFjdG9yX0EpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICByZW5hbWVfYWxsKGxpc3QofiAocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lX2FsbChsaXN0KH4gKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSkKYGBgCgpgYGB7ciB0b3AgbWF0Y2ggYWR1bHRzfQpjb25nX2FkdWx0c190b3BfbWF0Y2hfQSA8LSB0b3BfbWF0Y2hfZnVuKGNvbmdfYWR1bHRzLCAiY291bnRyeV9BIikKY29uZ19hZHVsdHNfdG9wX21hdGNoX0IgPC0gdG9wX21hdGNoX2Z1bihjb25nX2FkdWx0cywgImNvdW50cnlfQiIpCmBgYAoKYGBge3IgY29uZyBhbGwgcGFpcnMgYWR1bHRzLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC43fQpjb25nX2FkdWx0cyAlPiUKICBtdXRhdGVfYXQoI3ZhcnMoY29udGFpbnMoImxhYmRlc2NyaXB0IikpLAogICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICBmdW5zKGdzdWIoIiBcXCgiLCAiXG5cXCgiLCAuKSkpICU+JQogIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgIGZ1bnMoZ3N1YigiXFwvIiwgIlxcL1xuIiwgLikpKSAlPiUKICAjIGxlZnRfam9pbihjb25nX2FkdWx0c190b3BfbWF0Y2hfQSAlPiUgcmVuYW1lKHRvcF9tYXRjaF9BID0gdG9wX21hdGNoKSkgJT4lCiAgbGVmdF9qb2luKGNvbmdfYWR1bHRzX3RvcF9tYXRjaF9CICU+JSByZW5hbWUodG9wX21hdGNoX0IgPSB0b3BfbWF0Y2gpKSAlPiUKICBtdXRhdGUoaXNfdG9wX21hdGNoID0gY2FzZV93aGVuKGZhY3Rvcl9BID09IGZhY3Rvcl9CIH4gImJvbGQuaXRhbGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFjdG9yX0EgPT0gdG9wX21hdGNoX0EgfiAiYm9sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfQiA9PSB0b3BfbWF0Y2hfQiB+ICJib2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAicGxhaW4iKSkgJT4lCiAgIyBtdXRhdGUoY29uZyA9IGlmZWxzZShjb25nID09IDEsIE5BX3JlYWxfLCBjb25nKSkgJT4lCiAgbXV0YXRlKHNhbXBsZV9BID0gcGFzdGUodG91cHBlcihjb3VudHJ5X0EpLCAiYWR1bHRzIiwgc2VwID0gIjpcbiIpKSAlPiUKICBtdXRhdGUoc2FtcGxlX0IgPSBwYXN0ZSh0b3VwcGVyKGNvdW50cnlfQiksICJhZHVsdHMiLCBzZXAgPSAiOlxuIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKGNvdW50cnlfQSwgY291bnRyeV9CKSwKICAgICAgICAgICAgZnVucyhmYWN0b3IodG91cHBlciguKSwgbGV2ZWxzID0gdG91cHBlcihsZXZlbHNfY291bnRyeSkpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yX2xhYmRlc2NyaXB0X0EsCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihmYWN0b3JfbGFiZGVzY3JpcHRfQiwgZGVzYyhmYWN0b3JfbGFiZGVzY3JpcHRfQikpLAogICAgICAgICAgICAgZmlsbCA9IGNvbmcpKSArCiAgZmFjZXRfZ3JpZChyZW9yZGVyKHNhbXBsZV9CLCBhcy5udW1lcmljKGNvdW50cnlfQikpIH4gCiAgICAgICAgICAgICAgIHJlb3JkZXIoc2FtcGxlX0EsIGFzLm51bWVyaWMoY291bnRyeV9BKSksIAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY2FzZV93aGVuKGlzLm5hKGNvbmcpIH4gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZm9ybWF0KHJvdW5kKGNvbmcsIDIpLCBuc21hbGwgPSAyKSksCiAgICAgICAgICAgICAgICBmb250ZmFjZSA9IGlzX3RvcF9tYXRjaCwKICAgICAgICAgICAgICAgIGNvbG9yID0gaXNfdG9wX21hdGNoKSwKICAgICAgICAgICAgc2l6ZSA9IDMsIHNob3cubGVnZW5kID0gRikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrcmVkIiwgImRhcmtibHVlIiwgImJsYWNrIikpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAidmlyaWRpcyIsIAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAyNSwgYmFyaGVpZ2h0ID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gZXhwcmVzc2lvbihpdGFsaWMocltjXSkpKQpgYGAKCiMjIEJvb3RzdHJhcHBlZCBjb25ncnVlbmNlCgpgYGB7ciBib290c3RyYXAgY29uZ3J1ZW5jZSBhZHVsdHN9CmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9jb25nX2RmX2FkdWx0c190ZXQuUkRTIikpIHsKICAKICBjb25nX2RmX2FkdWx0cyA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzX3RldC5SRFMiKQogIAp9IGVsc2UgewogIAogIGJzX2FkdWx0cyA8LSBsb2FkaW5nc19hZHVsdHMgJT4lCiAgICBzZWxlY3QoY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSAlPiUKICAgIHNlbGVjdCgtY2FwYWNpdHkpICU+JQogICAgc2pzdGF0czo6Ym9vdHN0cmFwKDEwMDApIAogIAogIGZhY3RvcnMgPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19hZHVsdHMkZmFjdG9yKSkKICAKICBjb25nX2RmX2FkdWx0cyA8LSBkYXRhLmZyYW1lKE5VTEwpCiAgZm9yIChpIGluIGZhY3RvcnMpIHsKICAgIGZvciAoaiBpbiBmYWN0b3JzKSB7CiAgICAgIGNuYW1lIDwtIHBhc3RlKGksIGosIHNlcCA9ICIuIikKICAgICAgdGVtcCA8LSBic19hZHVsdHMgJT4lCiAgICAgICAgbXV0YXRlKGNvbmcgPSBtYXBfZGJsKHN0cmFwLCB+bHNhOjpjb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoLngpWyxqXSkpKQogICAgICBjb25nX2RmX2FkdWx0c1sxOjEwMDAsIGNuYW1lXSA8LSB0ZW1wJGNvbmcKICAgIH0KICB9CiAgCiAgY29uZ19kZl9hZHVsdHMgPC0gY29uZ19kZl9hZHVsdHMgJT4lCiAgICBnYXRoZXIoZmFjdG9yX3BhaXIsIGNvbmcpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGludG8gPSBjKCJmYWN0b3JfQSIsICJmYWN0b3JfQiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgICBncm91cF9ieShmYWN0b3JfQSwgZmFjdG9yX0IpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNvbmcpLAogICAgICAgICAgICAgIGNpX2xvd2VyID0gY2lfbG93ZXIoY29uZyksCiAgICAgICAgICAgICAgY2lfdXBwZXIgPSBjaV91cHBlcihjb25nKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkgJT4lCiAgICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkKICAKICBybShpLCBqLCBjbmFtZSwgdGVtcCwgZmFjdG9ycykKICAKICBzYXZlUkRTKGNvbmdfZGZfYWR1bHRzLCBmaWxlID0gIi4uL3Jlc3VsdHMvY29uZ19kZl9hZHVsdHNfdGV0LlJEUyIpCn0KYGBgCgpgYGB7ciBjb25nIG1pbiBhZHVsdHN9CiMgZmluZCBtaW5pbXVtIHZhbHVlIHRvIHNldCBjb25zdGFudCBsb3dlciBib3VuZCBvZiBwbG90cwptaW5fY29uZ19hZHVsdHMgPC0gY29uZ19kZl9hZHVsdHMgJT4lCiAgc3VtbWFyaXNlKG1pbl9jb25nID0gbWluKGNpX2xvd2VyLCBuYS5ybSA9IFQpKQpgYGAKCmBgYHtyIGNvbmcgY2lzIHVzIGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSAzCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCB3aGljaF9jb3VudHJ5ID0gIlVTIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKSArCiAgIyB5bGltKE5BLCAxKSArCiAgbGFicyh4ID0gTlVMTCkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAzX3RldC5wbmciKQpgYGAKCmBgYHtyIGNvbmcgY2lzIGdoIGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSBTMgpjb25nX3Bsb3RfZnVuKGNvbmdfZGYgPSBjb25nX2RmX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICAgICAgICAgICAgICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIiBcXCgiLCAiXG5cXCgiLCAuKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXFwvIiwgIlxcL1xuIiwgLikpKSwgCiAgICAgICAgICAgICAgd2hpY2hfY291bnRyeSA9ICJHaGFuYSIpICsKICB5bGltKG1pbl9jb25nX2FkdWx0cyRtaW5fY29uZywgMSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwMl90ZXQucG5nIikKYGBgCgpgYGB7ciBjb25nIGNpcyB0aCBiYXNlIGFkdWx0cywgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgUzMKY29uZ19wbG90X2Z1bihjb25nX2RmID0gY29uZ19kZl9hZHVsdHMsIAogICAgICAgICAgICAgIHdoaWNoX2NvdW50cnkgPSAiVGhhaWxhbmQiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDNfdGV0LnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgY2ggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFM0CmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIkNoaW5hIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA0X3RldC5wbmciKQpgYGAKCmBgYHtyIGNvbmcgY2lzIHZ0IGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSBTNQpjb25nX3Bsb3RfZnVuKGNvbmdfZGYgPSBjb25nX2RmX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICAgICAgICAgICAgICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIiBcXCgiLCAiXG5cXCgiLCAuKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXFwvIiwgIlxcL1xuIiwgLikpKSwgCiAgICAgICAgICAgICAgd2hpY2hfY291bnRyeSA9ICJWYW51YXR1IikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA1X3RldC5wbmciKQpgYGAKCmBgYHtyIGJvZHkgbWluZCBjb25nIGFkdWx0c30KIyAiSW4gZWFjaCBzYW1wbGUsIHRoZXJlIHdhcyBhIGZhY3RvciB0aGF0IHdhcyBzaW1pbGFyIHRvIFVTIGFkdWx0c+KAmSDigJxib2R54oCdIGZhY3Rvci4uLgpjb25nX2RmX2FkdWx0cyAlPiUgCiAgZmlsdGVyKGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLCAKICAgICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAhPSAiVVMiLCBjb3VudHJ5X0IgPT0gIlVTIikKCiMgIi4uLmFuZCBub3Qgc2ltaWxhciB0byB0aGUgVVMgYWR1bHQg4oCcbWluZOKAnSBmYWN0b3IsIC4uLgpjb25nX2RmX2FkdWx0cyAlPiUgCiAgZmlsdGVyKGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLCAKICAgICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAhPSAiVVMiLCBjb3VudHJ5X0IgPT0gIlVTIikKCiMgIi4uLiBhbmQgYSBmYWN0b3IgdGhhdCB3YXMgbXVjaCBtb3JlIHNpbWlsYXIgdG8gVVMgYWR1bHRz4oCZIOKAnG1pbmTigJ0gZmFjdG9yLi4uCmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICE9ICJVUyIsIGNvdW50cnlfQiA9PSAiVVMiKQoKIyAiLi4udGhhbiB0aGUgVVMgYWR1bHQg4oCcYm9keeKAnSBmYWN0b3IuIgpjb25nX2RmX2FkdWx0cyAlPiUgCiAgZmlsdGVyKGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLCAKICAgICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAhPSAiVVMiLCBjb3VudHJ5X0IgPT0gIlVTIikKYGBgCmBgYHtyIGhlYXJ0IGNvbmcgYWR1bHRzfQpjb25nX2RmX2FkdWx0cyAlPiUgCiAgZmlsdGVyKGdyZXBsKCJoZWFydCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJoZWFydCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICVpbiUgYygiVGhhaWxhbmQiLCAiQ2hpbmEiKSwgY291bnRyeV9CID09ICJVUyIpCgpjb25nX2RmX2FkdWx0cyAlPiUgCiAgZmlsdGVyKGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIHwgCiAgICAgICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksCiAgICAgICAgIGdyZXBsKCJoZWFydCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICVpbiUgYygiVGhhaWxhbmQiLCAiQ2hpbmEiKSwgY291bnRyeV9CID09ICJVUyIpCmBgYAoKCiMgQ2hpbGRyZW4KCiMjIFNhbXBsZXMKCmBgYHtyIHNhbXBsZXMgY2hpbGRyZW59CmJpbmRfcm93cyhkX3VzX2NoaWxkcmVuLCBkX2doX2NoaWxkcmVuLCBkX3RoX2NoaWxkcmVuLCBkX2NoX2NoaWxkcmVuLCBkX3Z0X2NoaWxkcmVuKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGRpc3RpbmN0KGNvdW50cnksIHN1YmpfaWQpICU+JQogIGNvdW50KGNvdW50cnkpICU+JSAKICBqYW5pdG9yOjphZG9ybl90b3RhbHMoKQpgYGAKCiMjIEZhY3RvciByZXRlbnRpb246IHBhcmFsbGVsIGFuYWx5c2lzCgpgYGB7ciBwYXJhbGxlbCBkaXN0IGNoaWxkcmVuLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC41fQojIEhlcmUncyB0aGUgZGlzdHJpYnV0aW9uIG92ZXIgb3V0Y29tZXMgb2YgcGFyYWxsZWwgYW5hbHlzaXMgd2l0aCAxMDAgaXRlcmF0aW9ucy4gV2UnbGwgY2hvb3NlIHRoZSBtZWRpYW4gbnVtYmVyIG9mIGZhY3RvcnMuCgppZiAoZmlsZS5leGlzdHMoIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbl90ZXQuUkRTIikpIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuIDwtIHJlYWRSRFMoIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbl90ZXQuUkRTIikKICAKfSBlbHNlIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuIDwtIGRhdGEuZnJhbWUodXMgPSBOVUxMLCBnaCA9IE5VTEwsIHRoID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBOVUxMLCB2dCA9IE5VTEwpCiAgCiAgc2V0LnNlZWQoNTQzMjEpCiAgbl9jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKQogIG9wdGlvbnMobWMuY29yZXMgPSBuX2NvcmVzKQogIAogIGZvciAoaSBpbiAxOjEwMCkgewogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAidXMiXSA8LSBmYS5wYXJhbGxlbChkX3VzX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAiZ2giXSA8LSBmYS5wYXJhbGxlbChkX2doX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdCAgICAgCiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ0aCJdIDwtIGZhLnBhcmFsbGVsKGRfdGhfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJjaCJdIDwtIGZhLnBhcmFsbGVsKGRfY2hfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ2dCJdIDwtIGZhLnBhcmFsbGVsKGRfdnRfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgfQogIAogIHNhdmVSRFMocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiwgZmlsZSA9ICIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW5fdGV0LlJEUyIpCn0KCiMgcGxvdApwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiaXRlciIpICU+JQogIGdhdGhlcihjb3VudHJ5LCBuZmFjdCwgLWl0ZXIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGdncGxvdChhZXMoeCA9IG5mYWN0KSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLCBtYXgocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbikgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEwMCwgMSkpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGZhY3RvcnMgc3VnZ2VzdGVkIGJ5IGZhLnBhcmFsbGVsKCkiKQpgYGAKCiMjIEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcwoKYGBge3IgZWZhIGNoaWxkcmVufQpzZXQuc2VlZCg1NDMyMSkKCiMgZG8gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzOiBjaGlsZHJlbgplZmFfdXNfY2hpbGRyZW4gPC0gZmFfZnVuKGRfdXNfY2hpbGRyZW5fdywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuJHVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fcm90ID0gIm9ibGltaW4iKQpjb2xuYW1lcyhlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidXNDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV9naF9jaGlsZHJlbiA8LSBmYV9mdW4oZF9naF9jaGlsZHJlbl93LAogICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiRnaCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzKSA8LSBwYXN0ZTAoImdoQ0hJTERSRU5fIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9naF9jaGlsZHJlbiRsb2FkaW5ncykpCgplZmFfdGhfY2hpbGRyZW4gPC0gZmFfZnVuKGRfdGhfY2hpbGRyZW5fdywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuJHRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fcm90ID0gIm9ibGltaW4iKQpjb2xuYW1lcyhlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidGhDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV9jaF9jaGlsZHJlbiA8LSBmYV9mdW4oZF9jaF9jaGlsZHJlbl93LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kY2gpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9uLml0ZXIgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV9jaF9jaGlsZHJlbiRsb2FkaW5ncykgPC0gcGFzdGUwKCJjaENISUxEUkVOXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfY2hfY2hpbGRyZW4kbG9hZGluZ3MpKQoKZWZhX3Z0X2NoaWxkcmVuIDwtIGZhX2Z1bihkX3Z0X2NoaWxkcmVuX3csIAogICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiR2dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSA8LSBwYXN0ZTAoInZ0Q0hJTERSRU5fIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV92dF9jaGlsZHJlbiRsb2FkaW5ncykpCmBgYAoKYGBge3IgZmFjdG9yIG5hbWVzIGNoaWxkcmVufQpmYWN0b3JfbmFtZXNfY2hpbGRyZW4gPC0gZGF0YS5mcmFtZShmYWN0b3IgPSBjKGNvbG5hbWVzKGVmYV91c19jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSkpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiY2hpbGRyZW4iKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGNhc2Vfd2hlbihncmVwbCgiXnVzIiwgZmFjdG9yKSB+ICJVUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl5naCIsIGZhY3RvcikgfiAiR2hhbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJedGgiLCBmYWN0b3IpIH4gIlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXmNoIiwgZmFjdG9yKSB+ICJDaGluYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl52dCIsIGZhY3RvcikgfiAiVmFudWF0dSIpLAogICAgICAgICBjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVsc19jb3VudHJ5KSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9uYW1lID0gZ3N1YigiXnVzIiwgIlVTICIsIGZhY3RvciksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiXmdoIiwgIkdoLiAiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiXnRoIiwgIlRoLiAiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiXmNoIiwgIkNoLiAiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiXnZ0IiwgIlZhLiAiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiQ0hJTERSRU4iLCAiY2hpbGRyZW4iLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiX0YiLCAiIEZhY3RvciAiLCBmYWN0b3JfbmFtZSkpICU+JQogIG11dGF0ZShmYWN0b3JfZGVzY3JpcHQgPSByZWNvZGUoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDSElMRFJFTl9GMSA9ICJCb2R5LWxpa2UsIG5lZ2F0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzQ0hJTERSRU5fRjIgPSAiSGVhcnQtbGlrZSwgcG9zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDSElMRFJFTl9GMyA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hDSElMRFJFTl9GMSA9ICJCb2R5LWxpa2UsIG5lZ2F0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQ0hJTERSRU5fRjIgPSAiTWluZC1saWtlLCBwb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaENISUxEUkVOX0YzID0gIlByYXksIGFkZCwgZXRjLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aENISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgcG9zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhDSElMRFJFTl9GMiA9ICJIZWFydC1saWtlLCBuZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aENISUxEUkVOX0YzID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aENISUxEUkVOX0Y0ID0gIkFkZCwgc2h5LCBldGMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjEgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YyID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YzID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0Y0ID0gIkd1aWx0LCBzaHksIHByYXksIGV0Yy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMSA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UsIHBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0Q0hJTERSRU5fRjMgPSAiSGVhcnQtbGlrZSwgbmVnYXRpdmUiKSwKICAgICAgICAgZmFjdG9yX2xhYmRlc2NyaXB0ID0gcGFzdGUoZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2Rlc2NyaXB0LCBzZXAgPSAiOiAiKSkKYGBgCgojIyBGYWN0b3IgbG9hZGluZ3MKCmBgYHtyIG9yZGVyIGNoaWxkcmVufQojIG9yZGVyIGNhcGFjaXRpZXM6IGNoaWxkcmVuCm9yZGVyX3VzX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3VzX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2doX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX2doX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3RoX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3RoX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2NoX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX2NoX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3Z0X2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3Z0X2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCmBgYAoKYGBge3IgbG9hZGluZ3MgY2hpbGRyZW59CiMgY29tcGlsZSBsb2FkaW5nczogY2hpbGRyZW4KbG9hZGluZ3NfY2hpbGRyZW4gPC0gYmluZF9yb3dzKAogIGxvYWRpbmdzX2Z1bihlZmFfdXNfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJVUyIpLAogIGxvYWRpbmdzX2Z1bihlZmFfZ2hfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdGhfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJUaGFpbGFuZCIpLAogIGxvYWRpbmdzX2Z1bihlZmFfY2hfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJDaGluYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdnRfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3VzID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl91c19jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF9naCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfZ2hfY2hpbGRyZW4pLAogICAgICAgICBjYXBhY2l0eV9vcmRfdGggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3RoX2NoaWxkcmVuKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2NoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9jaF9jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF92dCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdnRfY2hpbGRyZW4pKSAlPiUKICBhcnJhbmdlKGNvdW50cnksIGZhY3RvciwgZGVzYyhhYnMobG9hZGluZykpLCBjYXBhY2l0eSkgJT4lCiAgbXV0YXRlKG9yZGVyID0gMTpucm93KC4pKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuKQpgYGAKCmBgYHtyIGhlYXRtYXAgY2hpbGRyZW4sIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CiMgbWFrZSBoZWF0bWFwIGZpZ3VyZTogY2hpbGRyZW4KbG9hZGluZ3NfY2hpbGRyZW4gJT4lCiAgbXV0YXRlKGZhY3Rvcl9udW0gPSBhcy5udW1lcmljKGdzdWIoIi4qRiIsICIiLCBmYWN0b3IpKSkgJT4lCiAgbXV0YXRlKHNhbXBsZSA9IHBhc3RlKGNvdW50cnksICJjaGlsZHJlbiIsIHNlcCA9ICJcbiIpKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoZmFjdG9yX2xhYmRlc2NyaXB0LCBmYWN0b3JfbnVtKSwgCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfdXMpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2VjKSksIAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfZ2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3RoKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9jaCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfdnQpKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nKSkgKwogIGZhY2V0X2dyaWQofiByZW9yZGVyKHNhbXBsZSwgYXMubnVtZXJpYyhjb3VudHJ5KSksIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpLCBzaXplID0gMykgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAyMCwgYmFyd2lkdGggPSAwLjUpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgcGFuZWwuc3BhY2luZy54ID0gdW5pdCgwLjgsICJsaW5lcyIpLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJDYXBhY2l0eSIsIGZpbGwgPSAiRmFjdG9yXG5sb2FkaW5nIikKYGBgCgojIyBDb25ncnVlbmNlCgpTZWUgW0FsbCBzYW1wbGVzXSwgYmVsb3cuCgojIyBCb290c3RyYXBwZWQgY29uZ3J1ZW5jZQoKYGBge3IgYm9vdHN0cmFwIGNvbmdydWVuY2UgY2hpbGRyZW59CmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuX3RldC5SRFMiKSkgewogIAogIGNvbmdfZGZfY2hpbGRyZW4gPC0gcmVhZFJEUygiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuX3RldC5SRFMiKQogIAp9IGVsc2UgewogIAogIGJzX2NoaWxkcmVuIDwtIGxvYWRpbmdzX2NoaWxkcmVuICU+JQogICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBmdWxsX2pvaW4obG9hZGluZ3NfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgICAgICAgICAgICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykpICU+JQogICAgc2VsZWN0KC1jYXBhY2l0eSkgJT4lCiAgICBzanN0YXRzOjpib290c3RyYXAoMTAwMCkgCiAgCiAgY29uZ19kZl9jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKE5VTEwpCiAgCiAgZm9yIChrIGluIGxldmVsc19jb3VudHJ5KSB7CiAgICAKICAgIGZhY3RvcnNfY2hpbGRyZW4gPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19jaGlsZHJlbiRmYWN0b3JbCiAgICAgIGxvYWRpbmdzX2NoaWxkcmVuJGNvdW50cnkgPT0ga10pKQogICAgZmFjdG9yc19hZHVsdHMgPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19hZHVsdHMkZmFjdG9yWwogICAgICBsb2FkaW5nc19hZHVsdHMkY291bnRyeSA9PSBrXSkpCiAgICAKICAgIGZvciAoaSBpbiBmYWN0b3JzX2NoaWxkcmVuKSB7CiAgICAgIGZvciAoaiBpbiBmYWN0b3JzX2FkdWx0cykgewogICAgICAgIGNuYW1lIDwtIHBhc3RlKGksIGosIHNlcCA9ICIuIikKICAgICAgICB0ZW1wIDwtIGJzX2NoaWxkcmVuICU+JQogICAgICAgICAgbXV0YXRlKGNvbmcgPSBtYXBfZGJsKHN0cmFwLCB+bHNhOjpjb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgueClbLGpdKSkpCiAgICAgICAgY29uZ19kZl9jaGlsZHJlblsxOjEwMDAsIGNuYW1lXSA8LSB0ZW1wJGNvbmcKICAgICAgfQogICAgfQogICAgCiAgICBybShpLCBqLCBjbmFtZSwgdGVtcCwgZmFjdG9yc19jaGlsZHJlbiwgZmFjdG9yc19hZHVsdHMpCiAgICAKICB9CiAgCiAgcm0oaykKICAKICBjb25nX2RmX2NoaWxkcmVuIDwtIGNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgICBnYXRoZXIoZmFjdG9yX3BhaXIsIGNvbmcpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGludG8gPSBjKCJmYWN0b3JfQSIsICJmYWN0b3JfQiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgICBncm91cF9ieShmYWN0b3JfQSwgZmFjdG9yX0IpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNvbmcpLAogICAgICAgICAgICAgIGNpX2xvd2VyID0gY2lfbG93ZXIoY29uZyksCiAgICAgICAgICAgICAgY2lfdXBwZXIgPSBjaV91cHBlcihjb25nKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkJvZHktbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiTWluZC1saWtlXG5jaGlsZCBmYWN0b3IiLAogICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiSGVhcnQtbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0IgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkJvZHktbGlrZSBmYWN0b3IiLAogICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJMb2NhbCBhZHVsdHM6XG5NaW5kLWxpa2UgZmFjdG9yIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJMb2NhbCBhZHVsdHM6XG5PdGhlciBmYWN0b3IiKSkKICAKICBzYXZlUkRTKGNvbmdfZGZfY2hpbGRyZW4sIGZpbGUgPSAiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuX3RldC5SRFMiKQp9CmBgYAoKYGBge3IgY29uZyBtaW4gY2hpbGRyZW59CiMgZmluZCBtaW5pbXVtIHZhbHVlIHRvIHNldCBjb25zdGFudCBsb3dlciBib3VuZCBvZiBwbG90cwptaW5fY29uZ19jaGlsZHJlbiA8LSBjb25nX2RmX2NoaWxkcmVuICU+JQogIHN1bW1hcmlzZShtaW5fY29uZyA9IG1pbihjaV9sb3dlciwgbmEucm0gPSBUKSkKYGBgCgpgYGB7ciBjb25nIGNpcyBjaGlsZHJlbiwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNH0KIyBGSUdVUkUgNAojIGZpZy5hc3AgY2hvc2VuIHRvIGtlZXAgYWJzb2x1dGUgaGVpZ2h0IG9mIHktYXhpcyByZWxhdGl2ZWx5IHNpbWlsYXIgYWNyb3NzIGFkdWx0cyBhbmQgY2hpbGRyZW4KY29uZ19kZl9jaGlsZHJlbiAlPiUKICBtdXRhdGUocmVnaW9uX0EgPSBjYXNlX3doZW4oCiAgICBjb3VudHJ5X0EgPT0gIlVTIiB+ICJTRiBCYXkgQXJlYSIsCiAgICBjb3VudHJ5X0EgPT0gIkdoYW5hIiB+ICJDYXBlIENvYXN0IiwKICAgIGNvdW50cnlfQSA9PSAiVGhhaWxhbmQiIH4gIkNoaWFuZyBNYWkiLAogICAgY291bnRyeV9BID09ICJDaGluYSIgfiAiU2hhbmdoYWkiLAogICAgY291bnRyeV9BID09ICJWYW51YXR1IiB+ICJQViAmIE1hbGVrdWxhIikpICU+JQogIG11dGF0ZShzYW1wbGVfQSA9IHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EsIHNlcCA9ICJcbiIpKSAlPiUKICBtdXRhdGUobGFiX0EgPSBwYXN0ZShwYXN0ZTAocmVnaW9uX0EsICIsIiksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCh0b3VwcGVyKGNvdW50cnlfQSksICI6IiksIAogICAgICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cF9BLCBzZXAgPSAiXG4iKSkgJT4lCiAgbXV0YXRlKGJobV9BID0gY2FzZV93aGVuKAogICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSkgfiAiYm9keSIsCiAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2xhYmRlc2NyaXB0X0EpKSB+ICJtaW5kIiwKICAgIGdyZXBsKCJoZWFydCIsIHRvbG93ZXIoZmFjdG9yX2xhYmRlc2NyaXB0X0EpKSB+ICJoZWFydCIsIAogICAgVFJVRSB+ICJvdGhlciIpKSAlPiUKICBtdXRhdGUoYmhtX0EgPSBmYWN0b3IoYmhtX0EsIGxldmVscyA9IGMoImJvZHkiLCAiaGVhcnQiLCAibWluZCIsICJvdGhlciIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihmYWN0b3JfbGFiZGVzY3JpcHRfQSwgYXMubnVtZXJpYyhiaG1fQSkpLCB5ID0gbWVhbikpICsKICBmYWNldF9ncmlkKGZhY3Rvcl9iaG1fQiB+IHJlb3JkZXIobGFiX0EsIGFzLm51bWVyaWMoY291bnRyeV9BKSksIAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICAjIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gMC44NSwKICAjICAgICAgICAgIGZpbGwgPSAiZ3JheTIwIiwgYWxwaGEgPSAwLjIpICsKICAjIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAwLjg1LCB5bWF4ID0gMC45NSwKICAjICAgICAgICAgIGZpbGwgPSB2aXJpZGlzTGl0ZTo6dmlyaWRpcygyLCBiZWdpbiA9IDAuNzUvMiwgZW5kID0gMC43NSlbMV0sIGFscGhhID0gMC4yKSArCiAgIyBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMC45NSwgeW1heCA9IEluZiwKICAjICAgICAgICAgIGZpbGwgPSB2aXJpZGlzTGl0ZTo6dmlyaWRpcygyLCBiZWdpbiA9IDAuNzUvMiwgZW5kID0gMC43NSlbMl0sIGFscGhhID0gMC4yKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC44NSwgbHR5ID0gMiwgY29sb3IgPSAiZ3JheTEwIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuOTUsIGx0eSA9IDIsIGNvbG9yID0gImdyYXkxMCIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMywKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChtZWFuLCAyKSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICB5ID0gaWZlbHNlKGNpX2xvd2VyIDwgMC4yLCBjaV91cHBlciArIDAuMDUsIGNpX2xvd2VyIC0gMC4wNSksCiAgICAgICAgICAgICAgICB2anVzdCA9IGlmZWxzZShjaV9sb3dlciA8IDAuMiwgMCwgMSkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMSwgMSwgMC4yKSwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gZXhwYW5zaW9uKGFkZCA9IDAuMDUpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBhZXN0aGV0aWNzID0gYygiY29sb3IiLCAiZmlsbCIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IDIxOjI1KSArCiAgbGFicyh4ID0gTlVMTCwKICAgICAgIHkgPSBleHByZXNzaW9uKCJTaW1pbGFyaXR5ICIoaXRhbGljKHJbY10pKSkpICsgCiAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiLCBmaWxsID0gIm5vbmUiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IHNjYWxlczo6YWxwaGEoIndoaXRlIiwgMCksIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYyg1LjUsIDUuNSwgNS41LCAxNS41KSwgInBvaW50IikpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwNF90ZXQucG5nIikKYGBgCgpgYGB7ciBib2R5IG1pbmQgY29uZyBjaGlsZHJlbn0KIyAiSW4gZWFjaCBzYW1wbGUsIHRoZXJlIHdhcyBhIGZhY3RvciB0aGF0IHdhcyBtdWNoIG1vcmUgc2ltaWxhciB0byBsb2NhbCBhZHVsdHPigJkg4oCcYm9keS1saWtl4oCdIGZhY3Rvci4uLgpjb25nX2RmX2NoaWxkcmVuICU+JSAKICBmaWx0ZXIoZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQSkpLCAKICAgICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQikpKQoKIyAiLi4udGhhbiB0aGVpciDigJxtaW5kLWxpa2XigJ0gZmFjdG9yLCAuLi4KY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKCiMgIi4uLiBhbmQgYSBmYWN0b3IgdGhhdCB3YXMgbXVjaCBtb3JlIHNpbWlsYXIgdG8gbG9jYWwgYWR1bHRz4oCZIOKAnG1pbmQtbGlrZeKAnSBmYWN0b3IuLi4KY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKCiMgIi4uLnRoYW4gdGhlaXIg4oCcYm9keS1saWtl4oCdIGZhY3Rvci4iCmNvbmdfZGZfY2hpbGRyZW4gJT4lIAogIGZpbHRlcihncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2JobV9BKSksIAogICAgICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2JobV9CKSkpCmBgYAoKCiMgQWxsIHNhbXBsZXMKCiMjIENvbmdydWVuY2UKCmBgYHtyIGNvbmdydWVuY2UgYWxsIHNhbXBsZXN9CmNvbmdfYWxsIDwtIGZhLmNvbmdydWVuY2UoeCA9IGxpc3QoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdnRfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV91c19jaGlsZHJlbiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3RoX2NoaWxkcmVuJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9jaF9jaGlsZHJlbiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDUpICU+JQogICMgZ2V0X3VwcGVyX3RyaV9mdW4oKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpICU+JQogIGdhdGhlcihmYWN0b3JfQiwgY29uZywgLWZhY3Rvcl9BKSAlPiUKICBsZWZ0X2pvaW4oYmluZF9yb3dzKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSksCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkpICU+JQogIGxlZnRfam9pbihiaW5kX3Jvd3MoZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSkKYGBgCgpgYGB7ciBjb25nIGFsbCBwYWlycyBmb3JtYXR9CiMgbWFrZSB3aWRlLWZvcm0gdmVyc2lvbiBvZiBkZgpjb25nX2FsbF93IDwtIGNvbmdfYWxsICU+JQogIHNlbGVjdChmYWN0b3JfQSwgZmFjdG9yX0IsIGNvbmcpICU+JQogIHNwcmVhZChmYWN0b3JfQiwgY29uZykgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJmYWN0b3JfQSIpCgojIHRyZWF0IHNpbWlsYXJpdHkgbWF0cml4IGFzIGlmIGl0IHdlcmUgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBmb3IgaGNsdXN0CnJvdy5vcmRlciA8LSBoY2x1c3QoYXMuZGlzdCgoMSAtIGNvbmdfYWxsX3cpLzIpKSRvcmRlcgpjb2wub3JkZXIgPC0gaGNsdXN0KGFzLmRpc3QodCgoMSAtIGNvbmdfYWxsX3cpLzIpKSkkb3JkZXIKCiMgcmUtb3JkZXIgbWF0cml4IGFjY29yaW5nIHRvIGNsdXN0ZXJpbmcKY29uZ19hbGxfdyA8LSBjb25nX2FsbF93W3Jvdy5vcmRlciwgY29sLm9yZGVyXSAKCiMgZm9yIHNvbWUgcmVhc29uIHJlc2hhcGUyOjptZWx0KCkgd29ya3MgYmV0dGVyIHRoYW4gY3VycmVudCB0aWR5dmVyc2UgZnVuY3Rpb25zLi4uCmNvbmdfYWxsX29yZGVyZWQgPC0gbWVsdChhcy5tYXRyaXgoY29uZ19hbGxfdykpICU+JQogIHJlbmFtZShmYWN0b3JfQV9vcmRlcmVkID0gVmFyMSwgCiAgICAgICAgIGZhY3Rvcl9CX29yZGVyZWQgPSBWYXIyLAogICAgICAgICBjb25nID0gdmFsdWUpICU+JQogIG11dGF0ZShmYWN0b3JfQSA9IGFzLmNoYXJhY3RlcihmYWN0b3JfQV9vcmRlcmVkKSwKICAgICAgICAgZmFjdG9yX0IgPSBhcy5jaGFyYWN0ZXIoZmFjdG9yX0Jfb3JkZXJlZCkpICU+JQogIGZ1bGxfam9pbihjb25nX2FsbCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJfQSIpKSAlPiUgZGlzdGluY3QoKSkgJT4lCiAgZnVsbF9qb2luKGNvbmdfYWxsICU+JSBzZWxlY3QoY29udGFpbnMoIl9CIikpICU+JSBkaXN0aW5jdCgpKSAlPiUKICBtdXRhdGUobGFiX0EgPSBwYXN0ZShwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BKSwgZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHNlcCA9ICIsICIpLAogICAgICAgICBsYWJfQiA9IHBhc3RlKHBhc3RlKGNvdW50cnlfQiwgYWdlX2dyb3VwX0IpLCBmYWN0b3JfbGFiZGVzY3JpcHRfQiwgc2VwID0gIiwgIikpCiMgbXV0YXRlKHNhbXBsZV9BID0gcGFzdGUoY291bnRyeV9BLCBhZ2VfZ3JvdXBfQSwgc2VwID0gIiwgIiksCiMgICAgICAgIHNhbXBsZV9CID0gcGFzdGUoY291bnRyeV9CLCBhZ2VfZ3JvdXBfQiwgc2VwID0gIiwgIiksCiMgICAgICAgIGxhYl9BID0gcGFzdGUoc2FtcGxlX0EsIGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCBzZXAgPSAiICIpLAojICAgICAgICBsYWJfQiA9IHBhc3RlKHNhbXBsZV9CLCBmYWN0b3JfbGFiZGVzY3JpcHRfQiwgc2VwID0gIiAiKSkKYGBgCgpgYGB7ciBjb25nIGFsbCBwYWlycyBwbG90LCBmaWcud2lkdGggPSA5LjUsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIDIKY29uZ19sb3dlcl9saW0gPC0gaWZlbHNlKG1pbihjb25nX2FsbF9vcmRlcmVkJGNvbmcpID4gLTAuMDUsIC0wLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgIG1pbihjb25nX2FsbF9vcmRlcmVkJGNvbmcpKQojIGNvbmdfcGxvdF9jb2xvcnMgPC0gYygicmVkNCIsICJibHVlNCIsICJkYXJrb3JjaGlkNCIsICJibGFjayIpCiMgY29uZ19wbG90X2NvbG9ycyA8LSBjKCJibGFjayIsICJibGFjayIsICJibGFjayIsICJibGFjayIpCmNvbmdfcGxvdF9jb2xvcnMgPC0gYygicmVkNCIsICJyZWQ0IiwgInJlZDQiLCAiYmxhY2siKQoKY29uZ19hbGxfb3JkZXJlZCAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGxhYl9BLCBhcy5udW1lcmljKGZhY3Rvcl9BX29yZGVyZWQpKSwKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGxhYl9CLCBhcy5udW1lcmljKGRlc2MoZmFjdG9yX0Jfb3JkZXJlZCkpKSwKICAgICAgICAgICAgIGZpbGwgPSBjb25nKSkgKyAKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChjb25nLCAyKSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICBjb2xvciA9IGNhc2Vfd2hlbihjb25nID4gMC44NSB+ICJhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25nID4gMC43NSB+ICJiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmcgPiAwLjY1IH4gImMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJkIikpLAogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICAjICMgYm9keS1saWtlIGZhY3RvcnMKICAjIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDUuNSwgeG1heCA9IDE1LjUsIHltaW4gPSAxNi41LCB5bWF4ID0gMjYuNSwKICAjICAgICAgICAgIGNvbG9yID0gY29uZ19wbG90X2NvbG9yc1sxXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgIyAjIG1pbmQtbGlrZSBmYWN0b3JzCiAgIyBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxNS41LCB4bWF4ID0gMjUuNSwgeW1pbiA9IDYuNSwgeW1heCA9IDE2LjUsCiAgIyAgICAgICAgICBjb2xvciA9IGNvbmdfcGxvdF9jb2xvcnNbMl0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgIyBoZWFydC1saWtlIGZhY3RvcnMKICAjIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDI1LjUsIHhtYXggPSAzMS41LCB5bWluID0gMC41LCB5bWF4ID0gNi41LAogICMgICAgICAgICAgY29sb3IgPSBjb25nX3Bsb3RfY29sb3JzWzNdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIHNjYWxlX2ZpbGxfdmlyaWRpc19jKHRyYW5zID0gc2NhbGVzOjpleHBfdHJhbnMoYmFzZSA9IGV4cCgxKSksCiAgIyAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKGNvbmdfbG93ZXJfbGltLCAxKSwgCiAgIyAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoY29uZ19sb3dlcl9saW0sIDEsIDAuMDUpLAogICMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhmb3JtYXQoc2VxKGNvbmdfbG93ZXJfbGltLCAwLjgsIDAuMDUpLCBuc21hbGwgPSAyKSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwgCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjk1ID0gaGlnaCIsICIxLjAwIiksCiAgIyAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAidmlyaWRpcyIsCiAgIyAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDQwKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKCN0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICAgbGltaXRzID0gYyhjb25nX2xvd2VyX2xpbSwgMSksIAogICAgYnJlYWtzID0gc2VxKGNvbmdfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShjb25nX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICIwLjg1ID0gbW9kZXJhdGUiLCAiMC45MCIsIAogICAgICAgICAgICAgICAiMC45NSA9IGhpZ2giLCAiMS4wMCIpLAogICAgY29sb3JzID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoNiksCiAgICB2YWx1ZXMgPSBjKDAsIDAuNjUsIDAuNzUsIDAuODUsIDAuOTUsIDEpLAogICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siLCAiZ3JheTYwIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgICMgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEsCiAgICAgIGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBzaXplID0gc2l6ZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDIwLCAxNCkpLAogICAgICBjb2xvciA9IGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycyksCiAgICAgIGZhY2UgID0gZmFjZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSkpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSByZXYoc2l6ZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDIwLCAxNCkpKSwKICAgICAgY29sb3IgPSByZXYoY29sb3JfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBjb25nX3Bsb3RfY29sb3JzKSksCiAgICAgIGZhY2UgID0gcmV2KGZhY2VfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EpKSksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDIwKSwKICAgICMgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShzaXplID0gMC41KSwKICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygxLjUsIDAuNSkpLAogICAgICBjb2xvciA9IGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycykpLAogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9saW5lKAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygxLjUsIDAuNSkpKSwKICAgICAgY29sb3IgPSByZXYoY29sb3JfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBjb25nX3Bsb3RfY29sb3JzKSkpLAogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KDAuMjUsICJjbSIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBleHByZXNzaW9uKGl0YWxpYyhyW2NdKSkpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwMl90ZXQucG5nIikKYGBgCgojIyBKYWNjYXJkIFNpbWlsYXJpdHkKCmBgYHtyIGphY2NhcmQgYWxsIHNhbXBsZXN9CnN0cm9uZ19sb2FkX2FsbCA8LSBsb2FkaW5nc19hZHVsdHMgJT4lCiAgYmluZF9yb3dzKGxvYWRpbmdzX2NoaWxkcmVuKSAlPiUKICBzZWxlY3QoY291bnRyeSwgYWdlX2dyb3VwLCBmYWN0b3IsIGNhcGFjaXR5LCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoc3Ryb25nX2xvYWQgPSBpZmVsc2UobG9hZGluZyA+PSAwLjUsIDEsIDApKSAlPiUKICBzZWxlY3QoLWxvYWRpbmcpCgpjcm9zc19sb2FkX2FsbCA8LSBzdHJvbmdfbG9hZF9hbGwgJT4lCiAgZmlsdGVyKHN0cm9uZ19sb2FkID09IDEpICU+JQogIGNvdW50KGNvdW50cnksIGFnZV9ncm91cCwgY2FwYWNpdHksIHN0cm9uZ19sb2FkKSAlPiUKICBmaWx0ZXIobiA+IDEpICU+JQogIG11dGF0ZShjcm9zc19sb2FkID0gVCkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGFnZV9ncm91cCwgY2FwYWNpdHksIGNyb3NzX2xvYWQpCgpzdHJvbmdfbm9uY3Jvc3NfbG9hZF9hbGwgPC0gc3Ryb25nX2xvYWRfYWxsICU+JQogIGxlZnRfam9pbihjcm9zc19sb2FkX2FsbCkgJT4lCiAgZmlsdGVyKGlzLm5hKGNyb3NzX2xvYWQpKQoKamFjY2FyZF9hbGwgPC0gc3Ryb25nX25vbmNyb3NzX2xvYWRfYWxsICU+JQogIHNlbGVjdChmYWN0b3IsIGNhcGFjaXR5LCBzdHJvbmdfbG9hZCkgJT4lCiAgc3ByZWFkKGZhY3Rvciwgc3Ryb25nX2xvYWQpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiY2FwYWNpdHkiKSAlPiUKICB0KCkgJT4lCiAgZGlzdChtZXRob2QgPSAiYmluYXJ5IiwgZGlhZyA9IFQsIHVwcGVyID0gVCkgJT4lCiAgYXMubWF0cml4KCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKSAlPiUKICBnYXRoZXIoZmFjdG9yX0IsIGphY2NhcmQsIC1mYWN0b3JfQSkgJT4lCiAgIyBjb21wdXRlIHNpbWlsYXJpdHkgaW5kZXggaW5zdGVhZCBvZiBkaXN0YW5jZQogIG11dGF0ZShqYWNjYXJkID0gMSAtIGphY2NhcmQpICU+JQogIGxlZnRfam9pbihiaW5kX3Jvd3MoZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSkgJT4lCiAgbGVmdF9qb2luKGJpbmRfcm93cyhmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpKQpgYGAKCmBgYHtyIGphY2NhcmQgYWxsIHBhaXJzIGZvcm1hdH0KIyBtYWtlIHdpZGUtZm9ybSB2ZXJzaW9uIG9mIGRmCmphY2NhcmRfYWxsX3cgPC0gamFjY2FyZF9hbGwgJT4lCiAgc2VsZWN0KGZhY3Rvcl9BLCBmYWN0b3JfQiwgamFjY2FyZCkgJT4lCiAgc3ByZWFkKGZhY3Rvcl9CLCBqYWNjYXJkKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoImZhY3Rvcl9BIikKCiMgdHJlYXQgZGlzdGFuY2UgbWF0cml4IGFzIGlmIGl0IHdlcmUgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBmb3IgaGNsdXN0CnJvdy5vcmRlciA8LSBoY2x1c3QoYXMuZGlzdCgoMSAtIGphY2NhcmRfYWxsX3cpLzIpKSRvcmRlcgpjb2wub3JkZXIgPC0gaGNsdXN0KGFzLmRpc3QodCgoMSAtIGphY2NhcmRfYWxsX3cpLzIpKSkkb3JkZXIKCiMgcmUtb3JkZXIgbWF0cml4IGFjY29yaW5nIHRvIGNsdXN0ZXJpbmcKamFjY2FyZF9hbGxfdyA8LSBqYWNjYXJkX2FsbF93W3Jvdy5vcmRlciwgY29sLm9yZGVyXSAKCiMgZm9yIHNvbWUgcmVhc29uIHJlc2hhcGUyOjptZWx0KCkgd29ya3MgYmV0dGVyIHRoYW4gY3VycmVudCB0aWR5dmVyc2UgZnVuY3Rpb25zLi4uCmphY2NhcmRfYWxsX29yZGVyZWQgPC0gbWVsdChhcy5tYXRyaXgoamFjY2FyZF9hbGxfdykpICU+JQogIHJlbmFtZShmYWN0b3JfQV9vcmRlcmVkID0gVmFyMSwgCiAgICAgICAgIGZhY3Rvcl9CX29yZGVyZWQgPSBWYXIyLAogICAgICAgICBqYWNjYXJkID0gdmFsdWUpICU+JQogIG11dGF0ZShmYWN0b3JfQSA9IGFzLmNoYXJhY3RlcihmYWN0b3JfQV9vcmRlcmVkKSwKICAgICAgICAgZmFjdG9yX0IgPSBhcy5jaGFyYWN0ZXIoZmFjdG9yX0Jfb3JkZXJlZCkpICU+JQogIGZ1bGxfam9pbihqYWNjYXJkX2FsbCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJfQSIpKSAlPiUgZGlzdGluY3QoKSkgJT4lCiAgZnVsbF9qb2luKGphY2NhcmRfYWxsICU+JSBzZWxlY3QoY29udGFpbnMoIl9CIikpICU+JSBkaXN0aW5jdCgpKSAlPiUKICBtdXRhdGUobGFiX0EgPSBwYXN0ZShwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BKSwgZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHNlcCA9ICIsICIpLAogICAgICAgICBsYWJfQiA9IHBhc3RlKHBhc3RlKGNvdW50cnlfQiwgYWdlX2dyb3VwX0IpLCBmYWN0b3JfbGFiZGVzY3JpcHRfQiwgc2VwID0gIiwgIikpCiMgbXV0YXRlKHNhbXBsZV9BID0gcGFzdGUoY291bnRyeV9BLCBhZ2VfZ3JvdXBfQSwgc2VwID0gIiwgIiksCiMgICAgICAgIHNhbXBsZV9CID0gcGFzdGUoY291bnRyeV9CLCBhZ2VfZ3JvdXBfQiwgc2VwID0gIiwgIiksCiMgICAgICAgIGxhYl9BID0gcGFzdGUoc2FtcGxlX0EsIGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCBzZXAgPSAiICIpLAojICAgICAgICBsYWJfQiA9IHBhc3RlKHNhbXBsZV9CLCBmYWN0b3JfbGFiZGVzY3JpcHRfQiwgc2VwID0gIiAiKSkKYGBgCgpgYGB7ciBqYWNjYXJkIGFsbCBwYWlycyBwbG90LCBmaWcud2lkdGggPSA5LjUsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMxCmphY2NhcmRfbG93ZXJfbGltIDwtIGlmZWxzZShtaW4oamFjY2FyZF9hbGxfb3JkZXJlZCRqYWNjYXJkKSA+IDAsIDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWluKGphY2NhcmRfYWxsX29yZGVyZWQkamFjY2FyZCkpCiMgamFjY2FyZF9wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgImJsdWU0IiwgImRhcmtvcmNoaWQ0IiwgImJsYWNrIikKIyBqYWNjYXJkX3Bsb3RfY29sb3JzIDwtIGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIikKamFjY2FyZF9wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgInJlZDQiLCAicmVkNCIsICJibGFjayIpCgpqYWNjYXJkX2FsbF9vcmRlcmVkICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobGFiX0EsIGFzLm51bWVyaWMoZmFjdG9yX0Ffb3JkZXJlZCkpLAogICAgICAgICAgICAgeSA9IHJlb3JkZXIobGFiX0IsIGFzLm51bWVyaWMoZGVzYyhmYWN0b3JfQl9vcmRlcmVkKSkpLAogICAgICAgICAgICAgZmlsbCA9IGphY2NhcmQpKSArIAogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY2FzZV93aGVuKAogICAgIyBqYWNjYXJkICVpbiUgYygwLCAxKSB+IGZvcm1hdChyb3VuZChqYWNjYXJkLCAwKSwgbnNtYWxsID0gMCksCiAgICBUUlVFIH4gZm9ybWF0KHJvdW5kKGphY2NhcmQsIDIpLCBuc21hbGwgPSAyKSksCiAgICBjb2xvciA9IGNhc2Vfd2hlbihqYWNjYXJkID49IDAuNzUgfiAiYSIsIAogICAgICAgICAgICAgICAgICAgICAgamFjY2FyZCA+PSAwLjUgfiAiYiIsCiAgICAgICAgICAgICAgICAgICAgICBqYWNjYXJkID49IDAuMjUgfiAiYyIsCiAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImQiKSksCiAgICBzaG93LmxlZ2VuZCA9IEYpICsKICAjICMgbWluZC1saWtlIGFuZCBvdGhlciBmYWN0b3JzCiAgIyBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAwLjUsIHhtYXggPSAxNC41LCB5bWluID0gMTcuNSwgeW1heCA9IDMxLjUsCiAgIyAgICAgICAgICBjb2xvciA9IGphY2NhcmRfcGxvdF9jb2xvcnNbMl0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgIyBib2R5LWxpa2UgZmFjdG9ycwogICMgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMTQuNSwgeG1heCA9IDI0LjUsIHltaW4gPSA3LjUsIHltYXggPSAxNy41LAogICMgICAgICAgICAgY29sb3IgPSBqYWNjYXJkX3Bsb3RfY29sb3JzWzFdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjICMgaGVhcnQtbGlrZSBmYWN0b3JzCiAgIyBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAyNC41LCB4bWF4ID0gMzEuNSwgeW1pbiA9IDAuNSwgeW1heCA9IDcuNSwKICAjICAgICAgICAgIGNvbG9yID0gamFjY2FyZF9wbG90X2NvbG9yc1szXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoI3RyYW5zID0gc2NhbGVzOjpleHBfdHJhbnMoYmFzZSA9IGV4cCgxKSksCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhqYWNjYXJkX2xvd2VyX2xpbSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKGphY2NhcmRfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAgICAgICAgICAgICAgICAgICAgICAjIGxhYmVscyA9IGMoZm9ybWF0KHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwKICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAidmlyaWRpcyIsIAogICAgICAgICAgICAgICAgICAgICAgICMgZGlyZWN0aW9uID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICAjIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKCN0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICMgICBsaW1pdHMgPSBjKGphY2NhcmRfbG93ZXJfbGltLCAxKSwgCiAgIyAgIGJyZWFrcyA9IHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMSwgMC4wNSksCiAgIyAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgIyAgICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwgCiAgIyAgICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAjICAgY29sb3JzID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoNiksCiAgIyAgIHZhbHVlcyA9IGMoMCwgMC42NSwgMC43NSwgMC44NSwgMC45NSwgMSksCiAgIyAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImdyYXk2MCIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICAjIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgc2l6ZSA9IHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGphY2NhcmRfcGxvdF9jb2xvcnMpLAogICAgICBmYWNlICA9IGZhY2VfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EpKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycykpLAogICAgICBmYWNlICA9IHJldihmYWNlX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BKSkpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMCksCiAgICAjIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2xpbmUoCiAgICAgIHNpemUgPSBzaXplX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGphY2NhcmRfcGxvdF9jb2xvcnMpKSwKICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHJldihzaXplX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycykpKSwKICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgwLjI1LCAiY20iKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gIkphY2NhcmRcbnNpbWlsYXJpdHkiKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAxX3RldC5wbmciKQpgYGAKCiMjIERldmVsb3BtZW50YWwgY29tcGFyaXNvbnMKCmBgYHtyIGRldiBjb21wIGFsbCBzaXRlcywgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuMn0KIyBGSUdVUkUgUzYsIEZJR1VSRSBTNywgRklHVVJFIFM4LCBGSUdVUkUgUzksIEZJR1VSRSBTMTAKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV91c19hZHVsdHMsIGVmYV91c19jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIlVTIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA2X3RldC5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV9naF9hZHVsdHMsIGVmYV9naF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIkdoYW5hIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA3X3RldC5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV90aF9hZHVsdHMsIGVmYV90aF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIlRoYWlsYW5kIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA4X3RldC5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV9jaF9hZHVsdHMsIGVmYV9jaF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIkNoaW5hIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA5X3RldC5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV92dF9hZHVsdHMsIGVmYV92dF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIlZhbnVhdHUiLCBwYWRkaW5nID0gVCksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygyLCAxLjUpLCBsYWJlbHMgPSAiQVVUTyIpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMTBfdGV0LnBuZyIpCmBgYAoKYGBge3IgbG9hZGluZ3MgYWxsIHNhbXBsZXMsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNn0KIyBGSUdVUkUgMSwgdmVyc2lvbiAxCmhlYXRtYXBfY29tcF9mdW4obGlzdChlZmFfdXNfYWR1bHRzLCBlZmFfZ2hfYWR1bHRzLCBlZmFfdGhfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGVmYV9jaF9hZHVsdHMsIGVmYV92dF9hZHVsdHMsIAogICAgICAgICAgICAgICAgICAgICAgZWZhX3VzX2NoaWxkcmVuLCBlZmFfZ2hfY2hpbGRyZW4sIGVmYV90aF9jaGlsZHJlbiwgCiAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfY2hpbGRyZW4sIGVmYV92dF9jaGlsZHJlbiksIAogICAgICAgICAgICAgICAgIGZhY2V0X29yZGVyX3ZhcnMgPSBjKCJhZ2VfZ3JvdXAiLCAiY291bnRyeSIsICJmbnVtIiksCiAgICAgICAgICAgICAgICAgZmFjZXRfbGFiX3NwbGl0ID0gVCkgKwogIHRoZW1lKHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoYyhyZXAoMC4yLCA0KSwgMSwgcmVwKDAuMiwgNCkpLCAibGluZSIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDMwLCBiYXJoZWlnaHQgPSAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiRmFjdG9yIGxvYWRpbmciLCB0aXRsZS52anVzdCA9IDEpKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDF2MV90ZXQucG5nIikKYGBgCgpgYGB7ciBkb21pbmFudCBmYWN0b3IsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNiwgaW5jbHVkZSA9IEZ9CiMgaGlnaGxpZ2h0aW5nIGRvbWluYW50IGZhY3RvciAoaWdub3JpbmcgY3Jvc3MtbG9hZGluZ3MgPiAwLjA1KQpsb2FkaW5nc19hbGwgPC0gbG9hZGluZ3NfYWR1bHRzICU+JQogIHNlbGVjdCgtY29udGFpbnMoIm9yZCIpKSAlPiUKICBmdWxsX2pvaW4obG9hZGluZ3NfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgc2VsZWN0KC1jb250YWlucygib3JkIikpKQoKZG9tX2ZhY3RvcnNfYWxsIDwtIGxvYWRpbmdzX2FsbCAlPiUKICBncm91cF9ieShjb3VudHJ5LCBhZ2VfZ3JvdXAsIGNhcGFjaXR5KSAlPiUgCiAgdG9wX24oMSwgYWJzKGxvYWRpbmcpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGFnZV9ncm91cCwgY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgcmVuYW1lKGRvbV9mYWN0b3IgPSBmYWN0b3IsCiAgICAgICAgIGRvbV9sb2FkaW5nID0gbG9hZGluZykKCnJlY3RfZGYgPC0gbG9hZGluZ3NfYWxsICU+JQogIGZ1bGxfam9pbihkb21fZmFjdG9yc19hbGwpICU+JQogIG11dGF0ZShmbnVtID0gZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSkgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgiZmFjdG9yIikpICU+JQogIHNwcmVhZChmbnVtLCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoZGlmZjEgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYxKSwKICAgICAgICAgZGlmZjIgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYyKSwKICAgICAgICAgZGlmZjMgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYzKSwKICAgICAgICAgZGlmZjQgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEY0KSkgJT4lCiAgc2VsZWN0KC1jKGRvbV9sb2FkaW5nLCBzdGFydHNfd2l0aCgiRiIpKSkgJT4lCiAgZ2F0aGVyKHdoaWNoX2RpZmYsIGRpZmYsIHN0YXJ0c193aXRoKCJkaWZmIikpICU+JQogIGZpbHRlcihkaWZmICE9IDAsICFpcy5uYShkaWZmKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSkgJT4lCiAgdG9wX24oLTEsIGRpZmYpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoYW55X3NtYWxsID0gZGlmZiA8IDAuMDUpICU+JQogIHJlbmFtZShmYWN0b3IgPSBkb21fZmFjdG9yKSAlPiUKICBsZWZ0X2pvaW4oZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMsIGZhY3Rvcl9uYW1lc19jaGlsZHJlbikpCgojIGFuYWxvZyB0byBGSUdVUkUgMQp0ZW1wX2NhcF9vcmRlciA8LSBmYS5zb3J0KGVmYV91c19hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkgJT4lIHJldigpCgpnZ3Bsb3QocmVjdF9kZiAlPiUKICAgICAgICAgZmlsdGVyKCFpcy5uYShhbnlfc21hbGwpKSAlPiUKICAgICAgICAgbXV0YXRlKGNhcGFjaXR5ID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSB0ZW1wX2NhcF9vcmRlcikpLAogICAgICAgYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHQsIAogICAgICAgICAgIHkgPSBjYXBhY2l0eSwgCiAgICAgICAgICAgZmlsbCA9IGFueV9zbWFsbCkpICsKICBmYWNldF9ncmlkKH4gaW50ZXJhY3Rpb24oY291bnRyeSwgYWdlX2dyb3VwKSwgc3BhY2UgPSAiZnJlZSIsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21fdGlsZSgpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMocmVwKDAuMiwgNCksIDEsIHJlcCgwLjIsIDQpKSwgImxpbmUiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCiMgZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxdjJfdGV0LnBuZyIpCmBgYAoKYGBge3IgbG9hZGluZ3MgYWxsIHNhbXBsZXMgdjIsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNn0KIyBGSUdVUkUgMSwgdmVyc2lvbiAyIChpbmNsdWRlZCBpbiBtYWluIHRleHQpCmxvYWRpbmdzX2FkdWx0cyAlPiUKICBiaW5kX3Jvd3MobG9hZGluZ3NfY2hpbGRyZW4pICU+JQogICMgc2VsZWN0KC1jb250YWlucygiX29yZCIpKSAlPiUKICBtdXRhdGUoZmFjdG9yX2JobSA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSB+ICJCT0RZLWxpa2UgZmFjdG9ycyIsCiAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0KSkgfiAiTUlORC1saWtlIGZhY3RvcnMiLAogICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSB+ICJIRUFSVC1saWtlIGZhY3RvcnMiLAogICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICBsZWZ0X2pvaW4oc3Ryb25nX25vbmNyb3NzX2xvYWRfYWxsICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yLCBjYXBhY2l0eSwgc3Ryb25nX2xvYWQsIGNyb3NzX2xvYWQpKSAlPiUKICBtdXRhdGUoZm9udF9mYWNlID0gY2FzZV93aGVuKAogICAgc3Ryb25nX2xvYWQgPT0gMSAmIGlzLm5hKGNyb3NzX2xvYWQpIH4gImJvbGQiLAogICAgVFJVRSB+ICJwbGFpbiIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHBhc3RlKGdzdWIoIkZhY3RvciAiLCAiRiIsIGZhY3Rvcl9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfZGVzY3JpcHQsIHNlcCA9ICI6ICIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGFzLm51bWVyaWMoY291bnRyeSkpLCAKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5X29yZF91cywgZGVzYyhjYXBhY2l0eV9vcmRfdXMpKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZmFjdG9yX2JobSwgYWdlX2dyb3VwKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpLCAKICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gZm9udF9mYWNlKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMoMC4yLCAxLCAwLjIsIDEsIDAuMiwgMSwgMC4yKSwgImxpbmUiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAzMCwgYmFyaGVpZ2h0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkZhY3RvciBsb2FkaW5nIiwgdGl0bGUudmp1c3QgPSAxKSkKICAjIHNlbGVjdChjb3VudHJ5LCBjYXBhY2l0eSwgbG9hZGluZykgJT4lCiAgIyBtdXRhdGUobG9hZGluZyA9IHJvdW5kKGxvYWRpbmcsIDIpKSAlPiUKICAjIHNwcmVhZChjb3VudHJ5LCBsb2FkaW5nKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDF2Ml90ZXQucG5nIikKYGBgCgojIyBWYXJpYW5jZSBhY2NvdW50ZWQgZm9yCgpgYGB7cn0KVmFjY291bnRlZF9mdW4gPC0gZnVuY3Rpb24oZWZhX25hbWUpIHsKICBjb3VudHJ5IDwtIGdzdWIoImVmYV8iLCAiIiwgZWZhX25hbWUpCiAgY291bnRyeSA8LSBnc3ViKCJfLiokIiwgIiIsIGNvdW50cnkpCiAgYWdlX2dyb3VwIDwtIGNhc2Vfd2hlbihncmVwbCgiYWR1bHQiLCBlZmFfbmFtZSkgfiAiYWR1bHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJjaGlsZCIsIGVmYV9uYW1lKSB+ICJjaGlsZHJlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXykKICAKICBlZmEgPC0gZ2V0KGVmYV9uYW1lKQogIHJlcyA8LSBlZmEkVmFjY291bnRlZCAlPiUKICAgIGRhdGEuZnJhbWUoKSAlPiUKICAgIHJvd25hbWVzX3RvX2NvbHVtbigibWV0cmljIikgJT4lCiAgICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoIiwgInRoIiwgImNoIiwgInZ0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgICAgYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCwgbGV2ZWxzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuIikpKQogIAogIHJldHVybihyZXMpCn0KYGBgCgpgYGB7cn0KVmFjY291bnRlZF9hbGwgPC0gVmFjY291bnRlZF9mdW4oImVmYV91c19hZHVsdHMiKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV9naF9hZHVsdHMiKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfdGhfYWR1bHRzIikpICU+JQogIGZ1bGxfam9pbihWYWNjb3VudGVkX2Z1bigiZWZhX2NoX2FkdWx0cyIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV92dF9hZHVsdHMiKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfdXNfY2hpbGRyZW4iKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfZ2hfY2hpbGRyZW4iKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfdGhfY2hpbGRyZW4iKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfY2hfY2hpbGRyZW4iKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfdnRfY2hpbGRyZW4iKSkKYGBgCgpgYGB7cn0KVmFjY291bnRlZF9hbGwgJT4lCiAgZmlsdGVyKG1ldHJpYyAlaW4lIGMoIlByb3BvcnRpb24gVmFyIiwgIlByb3BvcnRpb24gRXhwbGFpbmVkIikpICU+JQogIGdhdGhlcihmYWN0b3IsIHZhbHVlLCBzdGFydHNfd2l0aCgiRiIpKSAlPiUKICBtdXRhdGUodmFsdWUgPSByb3VuZCh2YWx1ZSwgMikpICU+JQogIHNwcmVhZChjb3VudHJ5LCB2YWx1ZSkgJT4lCiAgYXJyYW5nZShhZ2VfZ3JvdXAsIGZhY3RvciwgbWV0cmljKQpgYGAKYGBge3J9ClZhY2NvdW50ZWRfYWxsICU+JQogIGZpbHRlcihtZXRyaWMgPT0gIkN1bXVsYXRpdmUgVmFyIikgJT4lCiAgZ2F0aGVyKGZhY3RvciwgdmFsdWUsIHN0YXJ0c193aXRoKCJGIikpICU+JQogIGdyb3VwX2J5KGNvdW50cnksIGFnZV9ncm91cCkgJT4lCiAgdG9wX24oMSwgdmFsdWUpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodmFsdWUgPSByb3VuZCh2YWx1ZSwgMikpICU+JQogIHNlbGVjdChtZXRyaWMsIGNvdW50cnksIGFnZV9ncm91cCwgdmFsdWUpICU+JQogIHNwcmVhZChjb3VudHJ5LCB2YWx1ZSkgJT4lCiAgYXJyYW5nZShhZ2VfZ3JvdXAsIG1ldHJpYykKYGBgCgojIyBJbnRlcmZhY3RvciBjb3JyZWxhdGlvbnMKCmBgYHtyLCBpbmNsdWRlID0gRn0KaW50ZXJmYWN0b3JfY29yX2Z1biA8LSBmdW5jdGlvbihlZmFfbmFtZSkgewogIHNhbXBsZSA9IGdzdWIoImVmYV8iLCAiIiwgZWZhX25hbWUpCiAgY291bnRyeSA9IGdzdWIoIl8uKiQiLCAiIiwgc2FtcGxlKQogIGFnZV9ncm91cCA9IGdzdWIoIl4uKl8iLCAiIiwgc2FtcGxlKQogIAogIGVmYSA8LSBnZXQoZWZhX25hbWUpCiAgCiAgIyBoYWNreSwgbm90IHN1cmUgd2h5IHRoaXMgd29ya3MsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSBpIGNvdWxkIGdldCBDSXMKICBkZiA8LSBwcmludChlZmEpICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfcGFpciIpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGMoImZhY3Rvcl9BIiAsImZhY3Rvcl9CIiksIHNlcCA9ICItIikgJT4lCiAgICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIikpLCB+IGdzdWIoIl4uKl8iLCAiIiwgLikpCiAgCiAgIyBkZiA8LSBlZmEkUGhpICU+JQogICMgICBkYXRhLmZyYW1lKCkgJT4lCiAgIyAgIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKQogICMgZ2F0aGVyKGZhY3Rvcl9CLCBwaGksIC1mYWN0b3JfQSkKICAKICBkZiA8LSBkZiAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIikpLAogICAgICAgICAgICB+IHBhc3RlMChjb3VudHJ5LCB0b3VwcGVyKGFnZV9ncm91cCksICJfIiwgLikpICU+JQogICAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoIiwgInRoIiwgImNoIiwgInZ0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgICAgYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCwgbGV2ZWxzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuIikpKQogIAogIHJldHVybihkZikKfQpgYGAKCmBgYHtyLCByZXN1bHRzID0gImhpZGUiLCAsIGluY2x1ZGUgPSBGfQpkX3BoaSA8LSBiaW5kX3Jvd3MoaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3VzX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2doX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3RoX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2NoX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3Z0X2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3VzX2NoaWxkcmVuIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfZ2hfY2hpbGRyZW4iKSwKICAgICAgICAgICAgICAgICAgIGludGVyZmFjdG9yX2Nvcl9mdW4oImVmYV90aF9jaGlsZHJlbiIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2NoX2NoaWxkcmVuIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfdnRfY2hpbGRyZW4iKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmRfcGhpIDwtIGRfcGhpICU+JQogIGZ1bGxfam9pbihkX3BoaSAlPiUKICAgICAgICAgICAgICByZW5hbWVfYWxsKH4gZ3N1YigiZmFjdG9yX0EiLCAiZmFjdG9yX0MiLCAuKSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+IGdzdWIoImZhY3Rvcl9CIiwgImZhY3Rvcl9EIiwgLikpICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofiBnc3ViKCJmYWN0b3JfRCIsICJmYWN0b3JfQSIsIC4pKSAlPiUKICAgICAgICAgICAgICByZW5hbWVfYWxsKH4gZ3N1YigiZmFjdG9yX0MiLCAiZmFjdG9yX0IiLCAuKSkpICU+JSBkaXN0aW5jdCgpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpkX3BoaSA8LSBkX3BoaSAlPiUKICBzZWxlY3QoLWNvdW50cnksIC1hZ2VfZ3JvdXApICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfY2hpbGRyZW4pICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofnBhc3RlMCguLCAiX0EiKSkpICU+JQogIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSB+ICJCb2R5LWxpa2UgZmFjdG9yIiwKICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIk1pbmQtbGlrZSBmYWN0b3IiLAogICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgIFRSVUUgfiAiT3RoZXIiKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbikgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+cGFzdGUwKC4sICJfQiIpKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9iaG1fQiA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkJvZHktbGlrZSBmYWN0b3IiLAogICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiTWluZC1saWtlIGZhY3RvciIsCiAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiSGVhcnQtbGlrZSBmYWN0b3IiLAogICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICBtdXRhdGVfYXQodmFycyhmYWN0b3JfYmhtX0EsIGZhY3Rvcl9iaG1fQiksCiAgICAgICAgICAgIH4gZmFjdG9yKC4sIGxldmVscyA9IGMoIkJvZHktbGlrZSBmYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFydC1saWtlIGZhY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbmQtbGlrZSBmYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciIpKSkgJT4lCiAgc2VsZWN0KC1jb3VudHJ5X0IsIC1hZ2VfZ3JvdXBfQikgJT4lCiAgcmVuYW1lKGNvdW50cnkgPSBjb3VudHJ5X0EsIGFnZV9ncm91cCA9IGFnZV9ncm91cF9BKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMSwgLCBpbmNsdWRlID0gRn0KZF9waGkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yX2JobV9BLCAKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGZhY3Rvcl9iaG1fQiwgZGVzYyhmYWN0b3JfYmhtX0IpKSwgCiAgICAgICAgICAgICBmaWxsID0gZXN0aW1hdGUpKSArCiAgZmFjZXRfZ3JpZChjb3VudHJ5IH4gYWdlX2dyb3VwLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQoZXN0aW1hdGUsIDIpLCBuc21hbGwgPSAyKSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCwgZmlsbCA9IHF1b3RlKHBoaSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjYsIGluY2x1ZGUgPSBGfQpkX3BoaSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3JfYmhtX0EsIAogICAgICAgICAgICAgY29sb3IgPSBjb3VudHJ5LAogICAgICAgICAgICAgIyBzaGFwZSA9IGFnZV9ncm91cCwKICAgICAgICAgICAgIHkgPSBlc3RpbWF0ZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSA1LCBjb2xvciA9ICJncmF5NTAiKSArCiAgZmFjZXRfZ3JpZChhZ2VfZ3JvdXAgfiBmYWN0b3JfYmhtX0IsIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMikgKwogICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChlc3RpbWF0ZSwgMiksIG5zbWFsbCA9IDIpKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IHF1b3RlKHBoaSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjcsIGluY2x1ZGUgPSBGfQpkX3BoaSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCAKICAgICAgICAgICAgIGNvbG9yID0gY291bnRyeSwKICAgICAgICAgICAgIGdyb3VwID0gYWdlX2dyb3VwLCBzaGFwZSA9IGFnZV9ncm91cCwKICAgICAgICAgICAgIHkgPSBlc3RpbWF0ZSkpICsKICBmYWNldF9ncmlkKGZhY3Rvcl9iaG1fQSB+IGZhY3Rvcl9iaG1fQiwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMiwgY29sb3IgPSAiZ3JleTUwIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogICMgZ2VvbV90ZXh0KGFlcyh5ID0gaWZlbHNlKGFnZV9ncm91cCA9PSAiYWR1bHRzIiwgCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGUgKyAwLjEsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGUgLSAwLjA1KSwKICAjICAgICAgICAgICAgICAgbGFiZWwgPSBmb3JtYXQocm91bmQoZXN0aW1hdGUsIDIpLCBuc21hbGwgPSAyKSksCiAgIyAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyhOQSwgMSksIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBxdW90ZShwaGkpLCAKICAgICAgIHNoYXBlID0gIkFnZSBncm91cCIsIHNpemUgPSAiQWdlIGdyb3VwIiwgCiAgICAgICBjb2xvciA9ICJTaXRlIikKYGBgCgpgYGB7cn0KY2F0KCJVUyBBRFVMVFNcbiIpCmVmYV91c19hZHVsdHMkUGhpCiMgKGVmYV91c19hZHVsdHMkUGhpKV4yCgpjYXQoIlxuVVMgQ0hJTERSRU5cbiIpCmVmYV91c19jaGlsZHJlbiRQaGkKIyAoZWZhX3VzX2NoaWxkcmVuJFBoaSleMgpgYGAKCmBgYHtyfQpjYXQoIkdIQU5BIEFEVUxUU1xuIikKZWZhX2doX2FkdWx0cyRQaGkKIyAoZWZhX2doX2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5HSEFOQSBDSElMRFJFTlxuIikKZWZhX2doX2NoaWxkcmVuJFBoaQojIChlZmFfZ2hfY2hpbGRyZW4kUGhpKV4yCmBgYAoKYGBge3J9CmNhdCgiVEhBSUxBTkQgQURVTFRTXG4iKQplZmFfdGhfYWR1bHRzJFBoaQojIChlZmFfdGhfYWR1bHRzJFBoaSleMgoKY2F0KCJcblRIQUlMQU5EIENISUxEUkVOXG4iKQplZmFfdGhfY2hpbGRyZW4kUGhpCiMgKGVmYV90aF9jaGlsZHJlbiRQaGkpXjIKYGBgCgpgYGB7cn0KY2F0KCJDSElOQSBBRFVMVFNcbiIpCmVmYV9jaF9hZHVsdHMkUGhpCiMgKGVmYV9jaF9hZHVsdHMkUGhpKV4yCgpjYXQoIlxuQ0hJTkEgQ0hJTERSRU5cbiIpCmVmYV9jaF9jaGlsZHJlbiRQaGkKIyAoZWZhX2NoX2NoaWxkcmVuJFBoaSleMgpgYGAKCmBgYHtyfQpjYXQoIlZBTlVBVFUgQURVTFRTXG4iKQplZmFfdnRfYWR1bHRzJFBoaQojIChlZmFfdnRfYWR1bHRzJFBoaSleMgoKY2F0KCJcblZBTlVBVFUgQ0hJTERSRU5cbiIpCmVmYV92dF9jaGlsZHJlbiRQaGkKIyAoZWZhX3Z0X2NoaWxkcmVuJFBoaSleMgpgYGAKCgo=